package com.example.restful.demo.controller;

import com.example.restful.demo.pojo.TestPojo;
import com.example.restful.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author fangjx
 * @date 2021/1/13
 *
 * restful 请求总结
 * get 跟 delete 直接都是拼接在url之后,根本不需要json格式 @RequestParam  @PathVariable
 * post跟put都是一样的 如果请求用json格式 单个对象(TestPojo) 基本类型数组(Long[] ids) List<TestPojo> 跟 map<都可以,都可以> 都是可以接收的 都用@RequestBody即可
 * post跟put如果不用json格式请求的话 单个对象(TestPojo)  基本类型数组(Long[] ids)  跟 map<都可以,都可以> 是可以接收的的 但List<对象>这种接收不了会报错
 *
 * @RequestBody只支持POST请求
 * 如果需要使用GET请求，可以使用@RequestParam和@PathVariable
 * 总结一句话 json格式是万能的可以接收一切格式的参数   除了get跟delete请求除外,因为它两根本不需要json
 *
 *
 */

@RestController
@RequestMapping("restful")
public class DemoController {


    @GetMapping("/get")//Get请求没有请求体不能传Json
    public TestPojo testGet(@RequestParam(name = "aa",required = true) String test){ //RequestParam默认要求前端传递属性与形参一致且必须传
        System.out.println("test:"+test);
        return new TestPojo("11","22");
    }

    /**
     * 测试成功
     * @param id
     * @return
     */
    @DeleteMapping("/delete/{id}")
    public String testDelete(@PathVariable String id){
        return id;
    }

    /**
     * http://localhost:8088/restful/delete2/1,2,3,4
     * 默认逗号可以分隔参数
     * 测试成功
     * @param ids
     * @return
     */
    @DeleteMapping("/delete2/{ids}")
    public String testDelete2(@PathVariable Long[] ids){

        for (int i = 0; i < ids.length; i++) {
            System.out.println(ids[i]);
        }

        return "success";
    }


    /**
     * 请求方式1:http://localhost:8088/restful/post?code=code&desc=desc
     * 请求方式2: 用postman放在body中的form-data
     * 测试post不是json请求
     * 方式 1&2 均成功
     * @param pojo
     * @return
     */
    @PostMapping("/post")
    public TestPojo testPost(TestPojo pojo){
        System.out.println(pojo.getCode());
        System.out.println(pojo.getDesc());
        return pojo;
    }

    /**
     * 测试post是json请求
     * postman测试 {}
     * @param pojo
     * @return
     */
    @PostMapping("/post2")
    public TestPojo testPost2(@RequestBody TestPojo pojo){
        System.out.println(pojo.getCode());
        System.out.println(pojo.getDesc());
        return pojo;
    }


    /**
     * 测试json数组
     * postman测试 [{},{}]
     * @param testPojos
     * @return
     */
    @PostMapping("/post3")
    public List<TestPojo> testPostList(@RequestBody List<TestPojo> testPojos){
        testPojos.forEach( e -> System.out.println("code:"+e.getCode() + "," +"desc:"+e.getDesc()));
        List<TestPojo> returnList = new ArrayList<TestPojo>();
        returnList.add(new TestPojo("11","11"));
        returnList.add(new TestPojo("22","22"));
        return returnList;
    }


    /**
     *
     * 测试post请求 url有参数 body也有参数
     * @return
     */
    @PostMapping("/postWithUrl")
    public String postWithUrl(@RequestParam  String url,@RequestBody TestPojo pojo){
        System.out.println(url);
        System.out.println(pojo);
        return "success";
    }



    /**
     * 测试非json数组对象接收
     * postman测试 在body里面form-data中加
     *
     * 测试直接报错
     *
     * @param testPojos
     * @return
     */
    @PostMapping("/post7")
    public String testPostList2(List<TestPojo> testPojos){
        for (int i=0;i<testPojos.size();i++){
            System.out.println(testPojos.get(i).getDesc());
            System.out.println(testPojos.get(i).getCode());
        }
        return "success";
    }


    /**
     * 测试非json数组接收
     * 测试:http://localhost:8088/restful/post8?ids=1,2,3,4,5
     * 默认逗号可以分隔参数
     * 成功
     * @param
     * @return
     */
    @GetMapping("/post8")
    public String testPostList2(Long[] ids){

        for (int i=0;i<ids.length;i++){
            System.out.println(ids[i]);
        }

        return "success";
    }

    /**
     * 测试json数组接收
     * 测试数据:[1,2,3,4]
     * 成功
     * @param
     * @return
     */
    @PostMapping("/post9")
    public String testPostList3(@RequestBody Long[] ids){

        for (int i=0;i<ids.length;i++){
            System.out.println(ids[i]);
        }

        return "success";
    }



    /**
     * 测试map接受
     * 不是json格式用@RequestParam
     * 是json格式用@RequestBody
     * @param map
     * @return
     */
    @PostMapping("/post4")
    public TestPojo testPost2(@RequestBody Map<String,String> map){

        System.out.println(map);

        Set<String> strings = map.keySet();
        for(String key :strings){
            System.out.println(map.get(key));
        }
        return new TestPojo("1","2");
    }




    /**
     * 测试post请求用String接收且是Json格式
     * 前端传递的json串会以整体的方式映射给str,会发现str2是Null
     * @param
     * @return
     */
    @PostMapping("/post5")
    public TestPojo testPost3(@RequestBody String str,String str2){
        System.out.println(str); // {"aa":"testStr","bbb":"testStr2"}
        System.out.println(str2);   //null
        return new TestPojo("1","2");
    }

    /**
     * 测试@RequestBody用在除了pojo和String的其他类型上
     * 答案:方法根本进不来序列化有问题
     * @param integer
     * @return
     */
    @PostMapping("/post6")
    public TestPojo testPost6(@RequestBody Integer integer){
        System.out.println(integer); //报错
        return new TestPojo("1","2");
    }


    /**
     * @RequestMapping不写value跟method是什么意思
     * 不写method则get post put delete方式都可以
     * 不写value则默认用类上的 即localhost:8088/restful就可以访问到这个方法了
     * @return
     */
    @RequestMapping
    public String testNotValue(){
        return "success";
    }


    @Autowired
    DemoService demoService;

    @GetMapping("/exception")
    public String testException(){

        //运行时异常调用者可以不显示处理异常
        demoService.test1("error");

        //检查性异常调用者必须显示处理
        try {
            demoService.test2("error");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "testException";
    }


    @GetMapping("/debug")
    public String testDebug(){

        String str = demoService.testDebug();

        System.out.println(str);

        return "testDebug";
    }



}
